<?php

namespace App\Helpers;

use App\Api\Helper\ReturnMessage;
use Excel;

class ExcelHelper
{
    private $_results;

    private $authHeader;
    /**
     * @param $data array  需输出到excel的数组
     * @param $fileName string  输出的excel文件名
     * @return bool 返回是否输出成功
     */
    public function exportFast($data,$fileName){
//        获取表头
        $tableheader=$this->getTableHeader();
//        获取返回数据
        $celData=$this->getTableBody($data,$tableheader);
//        调用输出
        $this->export($celData,$fileName);
        return true;
    }

    /**
     * @param $fullPath string 路径
     * @param $authHeader array 验证的头文件数组
     * @return mixed
     */
    public function importFast($fullPath,$authHeader=NULL){

        $this->authHeader=is_null($authHeader)?NULL:$authHeader;
        Excel::load($fullPath, function($reader) {
            $reader = $reader->getSheet(0);
            //获取表中的数据
            $a = $reader->toArray();
//                foreach($a as $k => $v){
//                    $a[$k] = array_filter($v);
//                }
            $this->_results = $a;
        });
        $re=$this->defaultHeader();
        if(!$re)
            return false;
        return $this->_results;
    }

    public function importUser($fullPath,$authHeader=NULL){

        $this->authHeader=is_null($authHeader)?NULL:$authHeader;
        Excel::load($fullPath, function($reader) {
            $reader = $reader->getSheet(0);
            //获取表中的数据
            $a = $reader->toArray();
                foreach($a as $k => $v){
                    $a[$k] = array_filter($v);
                }
            $this->_results = $a;
        });
        $re=$this->defaultHeader();
        if(!$re)
            return false;
        return $this->_results;
    }

    /**
     * 默认头文件配置
     */
    private function defaultHeader(){
//        如果使用默认头文件
        if(\Config::get('excel.setDefaultHeader')){
            array_shift($this->_results);
            array_unshift($this->_results,\Config::get('excel.defaultHeader'));
        }
//        判定当前提交的表头文件是否合法
//        $this->authHeaderEmpty();
//        echo 5;die;
        $re=$this->authHeader($this->_results[0]);
        if(!$re){
            return false;
        }
        return true;

    }

//    private function authHeaderEmpty(){
//        $header=$this->_results[0];
//        $num=count($header);
//        $a=0;
//        foreach($header as $v){
//            if(!$v) $a++;
//        }
//        if($a>=2){
//            ReturnMessage::success('cuowu',1001);die;
//
//            ReturnMessage::success('上传失败空文件',1001);
//            die;
//        }else{
//            echo 2;die;
//        }
//    }


//    验证表头文件
    private function authHeader($headData){
//        如果表头不是配置项中的表头文件返回错误
        $diffArr=array_diff($headData,$this->authHeader);
//        p($diffArr);die;
        if(empty($diffArr)){
            return true;
        }else{
            return false;
        }
    }

    /**
     * 传入数组和表头数据，数据重组
     * @param $data array 将传入的数组序列化
     * @param $tableheader  array 传入的表头数据
     * @return array    返回结果数组
     */

    private function getTableBody($data,$tableheader){
        $data=$this->object_array($data);
//        print_r($data);die;

//        获取重组后的完整数据
        $temp=array();
        foreach($data as $k=>$v){
            foreach($tableheader as $kk=>$vv){
//                var_dump($v[$kk]);die;
                if(isset($v[$kk])){
                    $temp[$k][]=$v[$kk];
                }
            }
        }
        $language=\Config::get('excel.execlLanguge');
        if($language=='ch'){
            array_unshift($temp,array_values($tableheader));
        }else if($language=='en'){
            array_unshift($temp,array_keys($tableheader));

        }


        return $temp;

    }

    /**
     * 递归：传入的对象数组化递归
     * @param $array array 获取当前传入
     * @return array   返回结果集数组
     */

    private function object_array($array) {
        if(is_object($array)) {
            $array = (array)$array;

        } if(is_array($array)) {
            foreach($array as $key=>$value) {
                $array[$key] = $this->object_array($value);
            }
        }
        return $array;
    }


    /**
     * @return array $re    表单头数据
     */
    private function getTableHeader(){
        $tableheader=\Config::get('excel._default');


        return $tableheader;
    }

    /**
     * @param $cellData array   需打印的数据
     */
    //Excel文件导出功能
    private function export($cellData,$fileName){
        Excel::create($fileName,function($excel) use ($cellData){
            $excel->sheet('score', function($sheet) use ($cellData){
                $sheet->rows($cellData);
            });
        })->export('xls');
    }



}
